File information:

VCCC_Gift.asm - source code (Pasmo assembler)
VCCC_Gift.bin - compiled code
VCCC_Gift.tap - compiled code an BASIC loader together in .tap format
VCCC_Gift_result.png - image of code and result
VCCC_Gift_info.txt - this text

Size results:

Size of source code - 294 bytes
Executable file size - 157 bytes
Net file size - 47 bytes

Instructions:

Load into your favorite Zx Spectrum emulator the file VCCC_Gift.tap

Source code with commentary:

offset	equ 19

	org $8000+offset

start
	push bc
	pop de		; BC holds start address - we move it to DE
			; and also A holds lower byte of the address
			; which is index for PO-MSG - in this case we
			; use 19 so that PO-MSG skips all sequences
			; where top bit is set and lands on bow
			; sequence
	call $0c0a
			; On entry HL holds $2D2B - return address for USR
			; function - which coincidently is ASCII for +-
			; which we use.
	call one_line	; print line of +-+-+

	call lines	; print block of lines of ! ! !
			; and then +-+-+ using CALL

			; and then print it again...
lines
	push hl		; save '+-'
	ld hl,$2021	; load ' !'
	ld e,8		; 8 times...
lines_1
	call one_line	; one line
	dec e
	jr nz,lines_1
	pop hl		; restore '+-' and
			; print one line

			; print one line of characters:
			; enter+first-8xsecond-first-8xsecond-first
one_line
	ld a,13		; enter
	rst 16
	ld a,l		; first character
	rst 16
	call one_repeat	; eight times second and first using CALL

			; and then again...
one_repeat
	ld b,8
one_rep_1
	ld a,h		; second character
	rst 16
	djnz one_rep_1	; loop
	ld a,l		; first character
	rst 16
	ret
bow
			; AT 0,8 ; \O/
			; top bit of last character set as end-marker
	db $16,$00,$08,$5c,$4f,$2f+$80

    end start